package com.aboo.frame.config.rocketmq;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class MqProducer implements ApplicationListener<ContextRefreshedEvent> {

    @Value("${rocketmq.namesrv.addr}")
    private String namesrvAddr;
    @Value("${rocketmq.producer.group-name}")
    private String groupName;

    public static DefaultMQProducer MQ_PRODUCER = null;

    private MqProducer() {

    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 避免初始化两次的现象发生
        if (event.getApplicationContext().getParent() == null) {
            try {
                log.info("开始加载RocketMQ生产者，namesrvAddr:{}，groupName:{}", namesrvAddr, groupName);
                // 需要一个producer group名字作为构造方法的参数，这里为producer1
                MQ_PRODUCER = new DefaultMQProducer(groupName);

                // 设置NameServer地址,此处应改为实际NameServer地址，多个地址之间用；分隔
                // NameServer的地址必须有，但是也可以通过环境变量的方式设置，不一定非得写死在代码里
                MQ_PRODUCER.setNamesrvAddr(namesrvAddr);
                MQ_PRODUCER.setVipChannelEnabled(false);
                // 发送失败，重试次数
                MQ_PRODUCER.setRetryTimesWhenSendFailed(3);

                // 为避免程序启动的时候报错，添加此代码，可以让rocketMq自动创建topickey
                MQ_PRODUCER.setCreateTopicKey("AUTO_CREATE_TOPIC_KEY");
                MQ_PRODUCER.start();
                log.info("加载RocketMQ生产者完成");
            } catch (Exception e) {
                log.error("初始化MQ生产者出错", e);
            }
        }
    }

}
